#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<error.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
typedef void (*func_t)();

#define NUM 5

func_t handlers[NUM+1];

void Download()
{
  printf("我是一个下载任务...\n");
}

void Flush()
{
  printf("我是一个刷新的任务...\n");
}

void lop()
{
  printf("我是一个日子任务...\n");
}

void registerHandler(func_t h[],func_t f)
{
  int i=0;
  for(;i<NUM;i++)
  {
    if(h[i]==NULL)
    {
      break;
    }
  }
  if(i==NUM)return;
  h[i]=f;
  h[i+1]=NULL;
}



int main()
{

  registerHandler(handlers,Download);

  registerHandler(handlers,Flush);
  registerHandler(handlers,lop);

  pid_t id=fork();

  if(id==0)
  {
  while(1)
  {
    sleep(3);
    printf("我是一个子进程,pid:%d,ppid:%d\n",getpid(),getppid());
  }
  exit(10);
  }
  
  while(1)
  {
    int status=0;
    pid_t rid=waitpid(id,&status,WNOHANG);
    if(rid>0)
    {
      printf("wait success,rid %d,exit code:%d,exit sigal:%d\n",rid,(status>>8)&0xFF,status&0x7F);  
      break;
    }
    else if(rid==0)
    {
      int i=0;
      for(;handlers[i];i++)
      {
        handlers[i]();
      }
      printf("本轮调用结束，子进程没有退出\n");
      sleep(1);
    }
    else{
      printf("等待失败\n");
      break;
    }
  }






  return 0;
}

